package webStudio7i.dao;

import java.sql.Connection;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;
import webStudio7i.excepcion.DAOExcepcion;
import webStudio7i.modelo.Usuario;
import webStudio7i.util.ConexionBD;

public class UsuarioDAO extends BaseDAO {

	public void insertar2(Usuario vo) throws DAOExcepcion {
		System.out.println("UsuarioDAO: insertar(Usuario vo)");
		String query1 = "INSERT INTO persona(nombre, apellido, dni, direccion, email, comentario, estado, fechahora_creacion, idusuario_actualizacion) VALUES (?,?,?,?,?,?,?,?,?)";
		String query2 = "INSERT INTO usuario(persona_idpersona, login, password, estado, fechahora_creacion, idusuario_actualizacion) VALUES (?,?,?,?,?,?)";
		Connection con = null;
		PreparedStatement stmt1 = null;
		PreparedStatement stmt2 = null;
		try {
			
			con = ConexionBD.obtenerConexion();
			
			stmt1 = con.prepareStatement(query1);			
			stmt1.setString(1, vo.getNombre());
			stmt1.setString(2, vo.getApellido());
			stmt1.setString(3, vo.getDni());
			stmt1.setString(4, vo.getDireccion());
			stmt1.setString(5, vo.getEmail());
			stmt1.setString(6, vo.getComentario());
			stmt1.setString(7, vo.getestado());
			stmt1.setString(8, vo.getfechahoracreacion());
			stmt1.setInt(9, 0);			
		
			stmt2 = con.prepareStatement(query2);
			stmt2.setInt(1, 2);
			stmt2.setString(2, vo.getLogin());
			stmt2.setString(3, vo.getPassword());
			stmt2.setString(4, vo.getEstado());
			stmt2.setString(5, vo.getFechahora_creacion());
			stmt2.setInt(6, 0);
			
			int i = stmt1.executeUpdate();
			if (i != 1) {
			throw new SQLException("No se pudo insertar");
			}
			
			int b = stmt2.executeUpdate();
			if (b != 1) {
			throw new SQLException("No se pudo insertar");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
			
		} finally {
			this.cerrarStatement(stmt1);
			this.cerrarStatement(stmt2);
			this.cerrarConexion(con);
		}
	}
	
	public Usuario verificarUsuarioExistente (Usuario usuario)throws DAOExcepcion{
		String query = "select dni, email from persona where dni = ? or email=?";
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		Usuario usu = new Usuario();
		
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, usuario.getDni());
			stmt.setString(2, usuario.getEmail());
			rs = stmt.executeQuery();			
					
			while (rs.next()) {	
				usu.setDni(rs.getString("dni"));
				usu.setEmail(rs.getString("email"));
			}
			
		} catch (SQLException e) {				
				System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);			
		}	
		
		return usu;
		
	}
		
	public Usuario buscarDatosUsuario(String nombre) throws DAOExcepcion {
			System.out.println("RolDAO: buscarPorNombre(String nombre)");
			String query = "select login, password, nombre, apellido, dni, direccion, email, comentario from usuario a, persona b where a.persona_idpersona=b.idpersona and a.login = ?";
			Connection con = null;
			PreparedStatement stmt = null;
			ResultSet rs = null;
			Usuario usu = new Usuario();
			try {
				con = ConexionBD.obtenerConexion();
				stmt = con.prepareStatement(query);
				stmt.setString(1, nombre);
				rs = stmt.executeQuery();
				
				while (rs.next()) {					
					usu.setLogin(rs.getString("login"));
					usu.setPassword(rs.getString("password"));
					usu.setNombre(rs.getString("nombre"));
					usu.setApellido(rs.getString("apellido"));
					usu.setDni(rs.getString("dni"));
					usu.setDireccion(rs.getString("direccion"));
					usu.setEmail(rs.getString("email"));
					usu.setComentario(rs.getString("comentario"));
								
				}
				
			} catch (SQLException e) {				
					System.err.println(e.getMessage());
				throw new DAOExcepcion(e.getMessage());
			} finally {
				this.cerrarResultSet(rs);
				this.cerrarStatement(stmt);
				this.cerrarConexion(con);
				
			}
			return usu;
		}
	
	public void insertar(Usuario vo) throws DAOExcepcion {
		System.out.println("UsuarioDAO: insertar(Usuario vo)");
		String query = "INSERT INTO persona(nombre, apellido, dni, fecha_nacimiento, direccion, email, comentario, estado, fechahora_creacion, idusuario_actualizacion) VALUES (?,?,?,?,?,?,?,?,?,?)";
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		
		try {
			
			con = ConexionBD.obtenerConexion();
			
			stmt = con.prepareStatement(query);			
			stmt.setString(1, vo.getNombre());
			stmt.setString(2, vo.getApellido());
			stmt.setString(3, vo.getDni());
			stmt.setString(4, vo.getfechanacimiento());
			stmt.setString(5, vo.getDireccion());
			stmt.setString(6, vo.getEmail());
			stmt.setString(7, vo.getComentario());
			stmt.setString(8, vo.getestado());
			stmt.setString(9, vo.getfechahoracreacion());
			stmt.setInt(10, 0);	
			
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo insertar");
				}
			
			query = "select idpersona from persona where dni = ?";
			stmt = con.prepareStatement(query);
			stmt.setString(1, vo.getDni());
			rs = stmt.executeQuery();
			
			while (rs.next()) {					
				vo.setIdpersona((rs.getInt("idpersona")));		
			}
			
			query = "INSERT INTO usuario(persona_idpersona, login, password, estado, fechahora_creacion, tipo_usuario, idusuario_actualizacion) VALUES (?,?,?,?,?,?,?)";
			stmt = con.prepareStatement(query);
			stmt.setInt(1, vo.getIdpersona());
			stmt.setString(2, vo.getLogin());
			stmt.setString(3, vo.getPassword());
			stmt.setString(4, vo.getEstado());
			stmt.setString(5, vo.getFechahora_creacion());
			stmt.setString(6, vo.getTipoUsuario());
			stmt.setInt(7, 0);
			
			i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo insertar");
			}
			
			
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
			
		} finally {
			this.cerrarStatement(stmt);			
			this.cerrarConexion(con);
		}
	}
	
	public Collection<Usuario> listarUsuarios() throws DAOExcepcion {
		System.out.println("VisitaDAO: listar()");
		Collection<Usuario> c = new ArrayList<Usuario>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			String query = "SELECT login, nombre, apellido, a.estado from usuario a, persona b where a.persona_idpersona=b.idpersona";
			stmt = con.prepareStatement(query);
			rs = stmt.executeQuery();
			while (rs.next()) {
				Usuario vo = new Usuario();
				vo.setLogin(rs.getString("login"));
				vo.setNombre(rs.getString("nombre"));
				vo.setApellido(rs.getString("apellido"));
				vo.setEstado(rs.getString("estado"));
				c.add(vo);
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return c;
	}
	
	public Usuario login(Usuario usuario) throws DAOExcepcion {
		System.out.println("UsuarioDAO: obtener(Usuario usuario)");
		Usuario vo = new Usuario();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			String query = "select idusuario , login , password , estado , tipo_usuario from usuario where login = ? and password = ?";
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, usuario.getLogin());
			stmt.setString(2, usuario.getPassword());
			rs = stmt.executeQuery();
			if (rs.next()) {
				vo.setIdusuario(rs.getInt(("idusuario")));
				vo.setPassword(rs.getString("password"));
				vo.setEstado(rs.getString("estado"));
				vo.setTipoUsuario(rs.getString("tipo_usuario"));			
						
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		if (vo != null) {
			return vo;
		}
		else{
			return null;
		}
	}
}





